home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The PC-SIG Library 9
/
The PC-SIG Library on CD ROM - Ninth Edition.iso
/
1201_300
/
DISK1262
/
DISK1262.ZIP
/
CMDLN.D
< prev
next >
Wrap
Text File
|
1988-07-11
|
3KB
|
158 lines
; Doug's Programming Language -- DPL, Version 2.22
; Copyright (c) 1988 Douglas S. Cody, All rights reserved.
;-------------------------------------
; CMDLN -- THIS ROUTINE RETURNS THE NEXT ELEMENT FROM THE
; COMMAND LINE INTO THE STRING SUPPLIED IN THE AX REGISTER
;
; Entry conditions:
; AX holds the string address
; ES segment contains the PSP segment
; Exit conditions:
; Carry clear = data available
; Carry set = No data available
;
; Calling Example:
;
; STRING STR,132
; ;
; CALL CMDLN STR
;
; Calling results:
;
; DOS>[PROG] /T TESTING A
;
; 1st call result:
; STR = "T"
;
; 2nd call result:
; STR = "TESTING"
;
; 3rd call result:
; STR = "A"
;
SUBPGM CMDLN
;
INTEGER PSPLEN
INTEGER PSPPTR
;
SPACE EQU 20H
TAB EQU 09H
SWITCH EQU 2FH
;
BEGIN CMDLN
CALL SETUP ; SETUP THE VARIABLES
JCXZ CMDL_20 ; EXIT IF NULL REMAINING...
;
CMDL_05:
LODSB ; FETCH THE CHARACTER
CMP AL,'/' ; SWITCH CHARACTER?
JE CMDL_06 ; YES, SKIP IT
CMP AL,' ' ; SPACE CHARACTER?
JE CMDL_06 ; YES, SKIP IT
CMP AL,09 ; TAB CHARACTER?
JNE CMDL_11 ; NO, ACCEPT IT
;
CMDL_06:
LOOP CMDL_05 ; LOOP TILL DONE...
JMP SHORT CMDL_20 ; EXIT IF DONE...
;
CMDL_10:
LODSB ; FETCH THE NEXT CHARACTER
CMP AL,'/' ; SWITCH? ('/')
JE CMDL_14 ; YES, QUIT.
CMP AL,' ' ; LESS THAN OR EQUAL TO A SPACE?
JLE CMDL_14 ; YES, QUIT.
CMP AL,09 ; TAB
JE CMDL_14 ; YES, QUIT.
;
CMDL_11:
STOSB
LOOP CMDL_10 ; CONTINUE TILL DONE...
JMP SHORT CMDL_15 ; SKIP THE ADJUSTMENT
;
CMDL_14:
DEC CX ; ADJUST FOR THE FOUND MATCH
;
CMDL_15:
MOV ES:[PSPPTR],SI ; SAVE THE POINTER
MOV ES:[PSPLEN],CX ; SAVE THE REMAINING LENGTH
CLC ; RETURN FULL...
;
CMDL_16:
PUSH ES ; SWAP ES & DS
PUSH DS
POP ES
POP DS
MOV BYTE PTR [DI],00H ; SET THE TERMINATOR
RET
;
CMDL_20:
STC ; RETURN NULL AND VOID
JMP SHORT CMDL_16 ; EXIT THROUGH COMMON CODE
;
;
; C M D A L L -- MOVE THE ENTIRE COMMAND LINE
;
; Entry conditions:
; None
; Exit conditions:
; None
;
PUBLIC CMDALL
CMDALL PROC
CALL SETUP
JCXZ CMDL_20 ; EXIT NULL & VOID
REP MOVSB ; MOVE THE WHOLE LINE
JMP CMDL_16 ; RETURN THROUGH COMMON CODE
CMDALL ENDP
;
;
; C M D R S T -- RESET THE POINTER TO THE BEGINNING OF THE COMMAND LINE
;
; Entry conditions:
; None
; Exit conditions:
; None
;
PUBLIC CMDRST
CMDRST PROC
MOV WORD PTR [PSPLEN],00H ; RESET THE PSP POINTERS
MOV WORD PTR [PSPPTR],00H
RET
CMDRST ENDP
;
;
;=====================
; ROUTINE SECTION
; LEVEL 1
;=====================
;
;
SETUP PROC NEAR
PUSH ES
PUSH DS ; SWAP ES & DS
POP ES ; ES = DATA SEGMENT
POP DS
;
MOV DI,AX ; DI POINTS TO THE TARGET
MOV SI,ES:[PSPPTR] ; FETCH THE PSP POINTER
MOV CX,ES:[PSPLEN] ; AND THE REMAINING LENGTH
OR SI,SI ; IS THIS A FRESH START?
JNE STUP_02 ; NO, USE THIS POINTER
;
MOV SI,80H ; YES, RE-INIT ALL
SUB CH,CH ; CLEAR THE MSB
MOV CL,[SI] ; ALSO THE COUNT
INC SI ; MOVE PAST THE LENGTH
;
STUP_02:
CLD ; ALL STRINGS FORWARD...
RET
SETUP ENDP
;
ENDPGM CMDLN
;